﻿using RuoYi.Framework.Core;

namespace RuoYi.Framework.Extensions;


//
// 摘要:
//     Extension methods for Collections.
public static class CollectionExtensions
{
    //
    // 摘要:
    //     Checks whatever given collection object is null or has no item.
    public static bool IsNullOrEmpty<T>(this ICollection<T>? source)
    {
        if (source != null)
        {
            return source.Count <= 0;
        }

        return true;
    }

    //
    // 摘要:
    //     Adds an item to the collection if it's not already in the collection.
    //
    // 参数:
    //   source:
    //     The collection
    //
    //   item:
    //     Item to check and add
    //
    // 类型参数:
    //   T:
    //     Type of the items in the collection
    //
    // 返回结果:
    //     Returns True if added, returns False if not.
    public static bool AddIfNotContains<T>(this ICollection<T> source, T item)
    {
        Check.NotNull(source, "source");
        if (source.Contains(item))
        {
            return false;
        }

        source.Add(item);
        return true;
    }

    //
    // 摘要:
    //     Adds items to the collection which are not already in the collection.
    //
    // 参数:
    //   source:
    //     The collection
    //
    //   items:
    //     Item to check and add
    //
    // 类型参数:
    //   T:
    //     Type of the items in the collection
    //
    // 返回结果:
    //     Returns the added items.
    public static IEnumerable<T> AddIfNotContains<T>(this ICollection<T> source, IEnumerable<T> items)
    {
        Check.NotNull(source, "source");
        List<T> list = new List<T>();
        foreach (T item in items)
        {
            if (!source.Contains(item))
            {
                source.Add(item);
                list.Add(item);
            }
        }

        return list;
    }

    //
    // 摘要:
    //     Adds an item to the collection if it's not already in the collection based on
    //     the given predicate.
    //
    // 参数:
    //   source:
    //     The collection
    //
    //   predicate:
    //     The condition to decide if the item is already in the collection
    //
    //   itemFactory:
    //     A factory that returns the item
    //
    // 类型参数:
    //   T:
    //     Type of the items in the collection
    //
    // 返回结果:
    //     Returns True if added, returns False if not.
    public static bool AddIfNotContains<T>(this ICollection<T> source, Func<T, bool> predicate, Func<T> itemFactory)
    {
        Check.NotNull(source, "source");
        Check.NotNull(predicate, "predicate");
        Check.NotNull(itemFactory, "itemFactory");
        if (source.Any(predicate))
        {
            return false;
        }

        source.Add(itemFactory());
        return true;
    }

    //
    // 摘要:
    //     Removes all items from the collection those satisfy the given predicate.
    //
    // 参数:
    //   source:
    //     The collection
    //
    //   predicate:
    //     The condition to remove the items
    //
    // 类型参数:
    //   T:
    //     Type of the items in the collection
    //
    // 返回结果:
    //     List of removed items
    public static IList<T> RemoveAll<T>(this ICollection<T> source, Func<T, bool> predicate)
    {
        List<T> list = source.Where(predicate).ToList();
        foreach (T item in list)
        {
            source.Remove(item);
        }

        return list;
    }

    //
    // 摘要:
    //     Removes all items from the collection.
    //
    // 参数:
    //   source:
    //     The collection
    //
    //   items:
    //     Items to be removed from the list
    //
    // 类型参数:
    //   T:
    //     Type of the items in the collection
    public static void RemoveAll<T>(this ICollection<T> source, IEnumerable<T> items)
    {
        foreach (T item in items)
        {
            source.Remove(item);
        }
    }
}
